perm filename FFT.FAI[900,BGB] blob
sn#129606 filedate 1974-11-12 generic text, type T, neo UTF8
00100 TITLE FFT
00200 INTERNAL BITREV,FFT,FFTINT
00300
00400 BITREV: 0 ;SUBROUTINE PUTS SPECTRA IN REVERSE BINARY ORDER
00500 BEGIN
00550 A←←0
00600 I←←1
00700 J←←2
00800 BITS←←3
00900 AC1←←3
01000 AC2←←4
01100 MOVEM 0,T0#
01200 MOVEM 1,T1#
01300 MOVEM 2,T2#
01400 MOVEM 3,T3#
01500 MOVE 0,0(16)
01600 HRRM C1
01700 HRRM C2
01800 HRRM C3
01900 HRRM C4
02000 HRRM C5
02100 HRRM C6
02200 HRRM C7
02300 HRRM C8
02400 MOVE 0,@1(16)
02500 MOVEI I,1
02600 ROT I,@0
02700 MOVEM I,TWOMTH# ;2**M
02800 SOJ I,
02900 MOVEM I,J
03000 C: CAMG I,J
03100 JRST B
03200 ROT I,1 ;SWAP
03300 ROT J,1
03400 C1: MOVE AC1,A(I)
03500 C2: MOVE AC2,A(J)
03600 C3: MOVEM AC2,A(I)
03700 C4: MOVEM AC1,A(J)
03800 AOJ I,
03900 AOJ J,
04000 C5: MOVE AC1,A(I)
04100 C6: MOVE AC2,A(J)
04200 C7: MOVEM AC2,A(I)
04300 C8: MOVEM AC1,A(J)
04400 ASH I,-1
04500 ASH J,-1
04600 B: MOVE BITS,TWOMTH ;DECREMENT
04700 ROT BITS,-1
04800 TDCN J,BITS
04900 JRST .-2
05000 SOJG I,C
05100 MOVE 0,T0
05200 MOVE 1,T1
05300 MOVE 2,T2
05400 MOVE 3,T3
05500 JRA 16,(16)
05600 BEND
05700
05800 ;FAST FOURIER TRANSFORM
05900 FFT: 0
06000 BEGIN
06100 ;SAVE THE ACCUMULATORS
06150 MOVE @(16)
06200 MOVEM IFS#
06300 MOVE [XWD 1,TEMPAC]
06400 BLT TEMPAC+17
06500 MOVE [XWD INITAC,1]
06600 BLT 17
06700
06800 ;DEFINE ACCUMULATORS
06900 A←←0
07000 S←←0
07100
07200 AC1←←0
07300 AC2←←1
07400 T←AC3←←2
07500 TI←←AC4←←3
07600 UI←←4
07700 UR←←5
07800 I2←I3←←6
07900 ;7
08000
08100 I←I1←←10
08200 N2←11
08300 J←FN←←12
08400 ILAST←FN2←←13
08500 LEXP←14
08600 LEXP1←15
08700 L←16
08800 NPL←17
08900
09000 ;FOURIER ANALYSIS
09100 SKIPL IFS
09200 JRST SCL1
09300 MOVEI I,1
09400
09500 FALOOP: FMPM FN,A+1(I)
09600 AOJ I,
09700 A0: FMPM FN2,A+1(I)
09800 AOJ I,
09900 CAMG I,N2
10000 JRST FALOOP
10100
10200 ;SPECIAL CASE L=1 LOOP
10300 SCL1: MOVEI I2,2
10400 SCL2: MOVE AC1,A(I2)
10500 A1: MOVE AC2,A+2(I2)
10600 A2: MOVE AC3,A+1(I2)
10700 A3: MOVE AC4,A+3(I2)
10800 A4: FADM AC2,A(I2)
10900 A5: FSBM AC1,A+2(I2)
11000 A6: FADM AC4,A+1(I2)
11100 A7: FSBM AC3,A+3(I2)
11200 ADDI I2,4
11300 CAMG I2,N2
11400 JRST SCL2
11500
11600 MOVE M
11700 SOJE RET
11800
11900 ;START OF L LOOP
12000 ;START OF J=0 SPECIAL LOOP
12100 LLOOP: MOVEI I,2
12200 SJLOOP: MOVE I2,I
12300 ADD I2,LEXP1
12400 ADD I2,LEXP1
12500 A10: MOVE AC1,A(I)
12600 A11: MOVE AC2,A(I2)
12700 A12: FSBM AC1,A(I2)
12800 A13: FADM AC2,A(I)
12900 A14: MOVE AC1,A+1(I)
13000 A15: MOVE AC2,A+1(I2)
13100 A16: FSBM AC1,A+1(I2)
13200 A17: FADM AC2,A+1(I)
13300 ADD I2,LEXP1
13400 ADD I,LEXP1
13500 A20: MOVE AC1,A+1(I1)
13600 A21: MOVN AC2,A+1(I3)
13700 A22: MOVE AC3,A(I3)
13800 A23: MOVE AC4,A(I1)
13900 A24: FADM AC3,A+1(I1)
14000 A25: FADM AC2,A(I1)
14100 FSB AC4,AC2
14200 A26: MOVEM AC4,A(I3)
14300 FSB AC1,AC3
14400 A27: MOVEM AC1,A+1(I3)
14450 SUB I,LEXP1
14500 ADD I,LEXP
14600 CAMG I,N2
14700 JRST SJLOOP
14800
14900 MOVE L
15000 SUBI 2
15100 JUMPLE S120
15200
15300 MOVEM NPL,JJ
15400
15500 ;START OF J LOOP
15600 MOVEI J,4
15700 MOVEI ILAST,4
15800 ADD ILAST,N2
15900 SUB ILAST,LEXP
16001 JLOOP: MOVE AC2,JJ
16003 MOVN AC3,AC2
16005 ADD AC3,NT
16300 S00: MOVE UR,S(AC3)
16400 S01: MOVE UI,S(AC2)
16500
16600 ;START OF I LOOP
16700 MOVE I,J
16800 ILOOP: MOVE I2,I
16900 ADD I2,LEXP1
17000 ADD I2,LEXP1
17100 A30: MOVE AC1,A(I2)
17200 MOVE T,AC1
17300 A31: MOVE AC2,A+1(I2)
17400 MOVE TI,AC2
17500 FMP AC1,UI
17600 FMP T,UR
17700 FMP AC2,UI
17800 FMP TI,UR
17900 FSB T,AC2
18000 FAD TI,AC1
18100
18200 A32: MOVE AC1,A(I)
18300 A33: MOVE AC2,A+1(I)
18400 FSB AC1,T
18500 FSB AC2,TI
18600 A34: FADM T,A(I)
18700 A35: FADM TI,A+1(I)
18800 A36: MOVEM AC1,A(I2)
18900 A37: MOVEM AC2,A+1(I2)
19000 ADD I2,LEXP1
19100 ADD I,LEXP1
19200
19300 A47: MOVE TI,A(I3)
19400 MOVN T,TI
19500 A50: MOVE AC1,A+1(I3)
19600 MOVE AC2,AC1
19700 FMP TI,UR
19800 FMP T,UI
19900 FMP AC1,UR
20000 FMP AC2,UI
20100 FSB TI,AC2
20200 FSB T,AC1
20300
20400 A40: MOVE AC1,A(I1)
20500 A41: MOVE AC2,A+1(I1)
20600 FSB AC1,T
20700 FSB AC2,TI
20800 A42: FADM T,A(I1)
20900 A43: FADM TI,A+1(I1)
21000 A44: MOVEM AC1,A(I3)
21100 A45: MOVEM AC2,A+1(I3)
21150 SUB I,LEXP1
21200
21300 ADD I,LEXP
21400 CAMG I,ILAST
21500 JRST ILOOP
21600 ;END OF I LOOP
21700 ADDM NPL,JJ
21800 ADDI ILAST,2
21900 ADDI J,2
22000 CAMG J,LEXP1
22100 JRST JLOOP
22200 ;END OF J LOOP
22300
22400 S120: ASH LEXP1,1
22500 ASH LEXP,1
22600 ASH NPL,-1
22700 AOJ L,
22800 CAMG L,M
22900 JRST LLOOP
23000 ;END OF L LOOP
23100
23200 SKIPL IFS
23300 JRST RET
23400 MOVE N2,NN2
23500 MOVEI I,2
23600 A46: MOVNS A+1(I)
23700 ADDI I,2
23800 CAMG I,N2
23900 JRST A46
24000
24100 RET: MOVE [XWD TEMPAC,1]
24200 BLT 17
24300 MOVE IFS
24400 JRA 16,(16)
24500
24600 ;FFTINIT (A,S,M,NT,N,N2,FN,NPL)
24700 ↑FFTINT: 0
24800 MOVE (16)
24900 HLLI
24950 SUBI 2
25000 ADDM FALOOP
25100 ADDM SCL2
25200 FOR @$ DUMMY←0,50
25300 {ADDM A$DUMMY
25400 ⎇
25500 MOVE 1(16)
25550 SUBI 1
25600 HRRM S00
25700 HRRM S01
25800 MOVE @2(16)
25900 MOVEM M
26000 MOVE @3(16)
26100 MOVEM NT
26200 MOVE @4(16)
26300 MOVEM NNN
26400 MOVE @5(16)
26500 MOVEM NN2
26600 MOVE @6(16)
26700 MOVEM TAC12
26800 MOVNM TAC13
26900 MOVE @7(16)
27000 MOVEM TAC17
27100 JRA 16,(16)
27200
27300 TEMPAC: 0
27400 BLOCK 20
27500 INITAC: 0 ↔ 0 ↔ 0 ↔ 0 ↔ 0 ↔ 0 ↔ 0 ↔ 0
27600 NN2: 0; N2 11
27700 TAC12: 0; FN 12
27800 TAC13: 0; FN2 13
27900 10; LEXP
28000 2; LEXP1 15
28050 2; L 16
28100 TAC17: 0; NPL 17
28200 M: 0
28300 JJ: 0
28400 NT: 0
28500 NNN: 0
28600 BEND
28700 END